package com.gqz.equip.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.gqz.common.core.domain.RequestForm;
import com.gqz.common.core.utils.query.QueryMapperUtil;
import com.gqz.equip.app.entity.TEnWzEquipEntity;
import com.gqz.equip.app.mapper.TEnWzEquipMapper;
import com.gqz.equip.entity.EnStockTaskEquipEntity;
import com.gqz.equip.entity.EnWzEquipLogEntity;
import com.gqz.equip.mapper.EnStockTaskEquipMapper;
import com.gqz.equip.mapper.EnWzEquipLogMapper;
import com.gqz.equip.mapstruct.EnWzEquipLogMapstruct;
import com.gqz.equip.service.IEnWzEquipLogService;
import com.gqz.equip.vo.EnWzEquipLogVo;
import com.gqz.equip.vo.EnWzEquipTaskLogVo;
import com.gqz.equip.vo.StockEquipStatisticsVo;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;


/**
 * 新能源设备信息--盘点工单对应历史记录 ҵ���߼�ʵ�ֲ�ServiceImpl
 *
 * @Version 1.0
 * @Author input you name
 */
@Service
@Slf4j
public class EnWzEquipLogServiceImpl extends ServiceImpl<EnWzEquipLogMapper, EnWzEquipLogEntity> implements IEnWzEquipLogService {

    @Autowired
    private EnWzEquipLogMapstruct mapstruct;

    @Resource
    private TEnWzEquipMapper equipMapper;

    @Resource
    private EnStockTaskEquipMapper taskEquipMapper;

    @Override
    public List<EnWzEquipLogVo> getById(String id) {
        MPJLambdaWrapper<EnWzEquipLogEntity> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.eq(EnWzEquipLogEntity::getId, id);
        queryWrapper.selectAll(EnWzEquipLogEntity.class);
        List<EnWzEquipLogEntity> entities = baseMapper.selectList(queryWrapper);
        if (CollectionUtils.isNotEmpty(entities)) {
            return mapstruct.toVos(entities);
        }
        return new ArrayList<>();
    }

    @Override
    public Page<EnWzEquipLogVo> page(RequestForm<EnWzEquipLogVo> requestForm) {
        EnWzEquipLogEntity entity = mapstruct.toEntity(requestForm.getEntity());
        MPJLambdaWrapper<EnWzEquipLogEntity> queryWrapper = QueryMapperUtil.initQueryWrapper(entity, requestForm);
        queryWrapper.selectAll(EnWzEquipLogEntity.class);
        Page<EnWzEquipLogEntity> page = Page.of(requestForm.getPageNo(), requestForm.getPageSize());
        //page = baseMapper.selectPage(page, queryWrapper);
        IPage<EnWzEquipLogEntity> iPage = baseMapper.selectJoinPage(page, EnWzEquipLogEntity.class, queryWrapper);
        page.setRecords(iPage.getRecords());
        page.setTotal(iPage.getTotal());
        return mapstruct.toVos(page);
    }

    @Override
    public Long count(RequestForm<EnWzEquipLogVo> requestForm) {
        EnWzEquipLogEntity entity = mapstruct.toEntity(requestForm.getEntity());
        MPJLambdaWrapper<EnWzEquipLogEntity> queryWrapper = QueryMapperUtil.initQueryWrapper(entity, requestForm);
        queryWrapper.select(EnWzEquipLogEntity::getId);
        return baseMapper.selectCount(queryWrapper);
    }

    @Override
    public int insert(List<EnWzEquipLogVo> forms) {
        List<EnWzEquipLogEntity> entitys = mapstruct.toEntitys(forms);
        int result = 0;
        for (int i = 0, size = entitys.size(); i < size; i++) {
            EnWzEquipLogEntity entity = entitys.get(i);
            result += baseMapper.insert(entity);
        }
        return result;
    }

    @Override
    public int update(List<EnWzEquipLogVo> forms) {
        List<EnWzEquipLogEntity> entitys = mapstruct.toEntitys(forms);
        int result = 0;
        for (int i = 0, size = entitys.size(); i < size; i++) {
            EnWzEquipLogEntity entity = entitys.get(i);
            result += baseMapper.updateById(entity);
        }
        return result;
    }

    @Override
    public void insertEquipLog(String stockNo, String taskNo) {
        List<EnWzEquipLogEntity> insertEquipLogList = new ArrayList<>();
        LambdaQueryWrapper<TEnWzEquipEntity> queryEquipWrapper = new LambdaQueryWrapper<TEnWzEquipEntity>();
        queryEquipWrapper.eq(TEnWzEquipEntity::getSskfbm, stockNo);
        List<TEnWzEquipEntity> equipEntities = this.equipMapper.selectList(queryEquipWrapper);
        equipEntities.forEach(equipEntity -> {
            EnWzEquipLogEntity equipLogEntity = new EnWzEquipLogEntity();
            BeanUtil.copyProperties(equipEntity, equipLogEntity);
            equipLogEntity.setTaskNo(taskNo);
            insertEquipLogList.add(equipLogEntity);
        });
        this.saveBatch(insertEquipLogList);
    }

    @Override
    public Page<EnWzEquipLogVo> getTaskEquipMatchList(RequestForm<StockEquipStatisticsVo> requestForm) {
        Page<EnWzEquipLogEntity> page = Page.of(requestForm.getPageNo(), requestForm.getPageSize());
        MPJLambdaWrapper<EnWzEquipLogEntity> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(EnWzEquipLogEntity.class);
        //queryWrapper.innerJoin(TEnWzEquipEntity.class, TEnWzEquipEntity::getCcbm, EnWzEquipLogEntity::getCcbm);
        //queryWrapper.innerJoin(EnStockTaskEquipEntity.class, EnStockTaskEquipEntity::getFactoryNo, EnWzEquipLogEntity::getCcbm);
        queryWrapper.innerJoin(EnStockTaskEquipEntity.class, on -> {
            on.eq(EnStockTaskEquipEntity::getFactoryNo, EnWzEquipLogEntity::getCcbm);
            on.eq(EnStockTaskEquipEntity::getIsDel, 0);
            on.eq(EnStockTaskEquipEntity::getTaskNo, EnWzEquipLogEntity::getTaskNo);
            return on;
        });
        queryWrapper.eq(EnWzEquipLogEntity::getTaskNo, requestForm.getEntity().getTaskNo());
        queryWrapper.eq(StringUtils.isNotBlank(requestForm.getEntity().getEquipTypeNo()), EnWzEquipLogEntity::getSblxbm, requestForm.getEntity().getEquipTypeNo());
        return (Page<EnWzEquipLogVo>) this.baseMapper.selectJoinPage(page, EnWzEquipLogVo.class, queryWrapper);
    }

    /**
     * 根据任务编码获取设备差异列表
     *
     * @param vo 参数
     * @return
     */
    @Override
    public List<EnWzEquipTaskLogVo> getTaskEquipDiffList(StockEquipStatisticsVo vo) {
        List<String> stockLogDiffList = vo.getStockLogDiffList();
        List<String> stockTaskDiffList = vo.getStockTaskDiffList();

        MPJLambdaWrapper<EnWzEquipLogEntity> queryLogWrapper = new MPJLambdaWrapper<>();
        queryLogWrapper.selectAll(EnWzEquipLogEntity.class);
        queryLogWrapper.eq(StringUtils.isNotBlank(vo.getTaskNo()), EnWzEquipLogEntity::getTaskNo, vo.getTaskNo());
        queryLogWrapper.eq(StringUtils.isNotBlank(vo.getEquipTypeNo()), EnWzEquipLogEntity::getSblxbm, vo.getEquipTypeNo());
        if (stockLogDiffList.size() > 0) {
            queryLogWrapper.in(EnWzEquipLogEntity::getCcbm, stockLogDiffList);
        } else {
            queryLogWrapper.in(EnWzEquipLogEntity::getCcbm, "");
        }
        //queryLogWrapper.in(CollectionUtils.isNotEmpty(stockLogDiffList),EnWzEquipLogEntity::getCcbm, stockLogDiffList);
        List<EnWzEquipLogEntity> equipLogEntities = this.baseMapper.selectList(queryLogWrapper);

        MPJLambdaWrapper<EnStockTaskEquipEntity> queryNowWrapper = new MPJLambdaWrapper<>();
        queryNowWrapper.select(EnStockTaskEquipEntity::getTaskNo);
        queryNowWrapper.selectAs(EnStockTaskEquipEntity::getEquipNo, "sbbm");
        queryNowWrapper.selectAs(EnStockTaskEquipEntity::getEquipName, "sbmc");
        queryNowWrapper.selectAs(EnStockTaskEquipEntity::getFactoryNo, "ccbm");
        //设备类型 计量方式 规格 型号 pt ct 厂家
        queryNowWrapper.selectAs(EnStockTaskEquipEntity::getEquipTypeNo, "sblxbm");
        queryNowWrapper.selectAs(EnStockTaskEquipEntity::getEquipTypeName, "sblxmc");
        queryNowWrapper.selectAs(EnStockTaskEquipEntity::getMeterTypeNo, "jlfsbm");
        queryNowWrapper.selectAs(EnStockTaskEquipEntity::getMeterTypeName, "jlfsmc");
        queryNowWrapper.selectAs(EnStockTaskEquipEntity::getEquipSpecification, "sbgg");
        queryNowWrapper.selectAs(EnStockTaskEquipEntity::getModel, "xh");
        queryNowWrapper.selectAs(EnStockTaskEquipEntity::getPt, "pt");
        queryNowWrapper.selectAs(EnStockTaskEquipEntity::getCt, "ct");
        queryNowWrapper.selectAs(EnStockTaskEquipEntity::getFactoryName, "cjmc");
        queryNowWrapper.select(EnStockTaskEquipEntity::getStockMethodName);
        queryNowWrapper.select(EnStockTaskEquipEntity::getStockMethodNo);

        //queryNowWrapper.selectAll(TEnWzEquipEntity.class);
        queryNowWrapper.leftJoin(TEnWzEquipEntity.class, TEnWzEquipEntity::getCcbm, EnStockTaskEquipEntity::getFactoryNo);
        queryNowWrapper.eq(StringUtils.isNotBlank(vo.getTaskNo()), EnStockTaskEquipEntity::getTaskNo, vo.getTaskNo());
        queryNowWrapper.eq(StringUtils.isNotBlank(vo.getEquipTypeNo()), EnStockTaskEquipEntity::getEquipTypeNo, vo.getEquipTypeNo());
        if (stockTaskDiffList.size() > 0) {
            queryNowWrapper.in(EnStockTaskEquipEntity::getFactoryNo, stockTaskDiffList);
        } else {
            queryNowWrapper.in(EnStockTaskEquipEntity::getFactoryNo, "");
        }
        //queryNowWrapper.in( CollectionUtils.isNotEmpty(stockTaskDiffList),EnStockTaskEquipEntity::getFactoryNo, stockTaskDiffList);//
        List<EnWzEquipTaskLogVo> equipTaskVos = this.taskEquipMapper.selectJoinList(EnWzEquipTaskLogVo.class, queryNowWrapper);

        List<EnWzEquipTaskLogVo> resultList = new ArrayList<>();
        equipLogEntities.forEach(equipLogEntity -> {
            EnWzEquipTaskLogVo equipTaskLogVo = new EnWzEquipTaskLogVo();
            BeanUtil.copyProperties(equipLogEntity, equipTaskLogVo);
            equipTaskLogVo.setTaskLogType("log");
            equipTaskLogVo.setStockNum("1");
            equipTaskLogVo.setPd("0");
            equipTaskLogVo.setStockMethodName("-");
            resultList.add(equipTaskLogVo);
        });
        equipTaskVos.forEach(equipTaskVo -> {
            EnWzEquipTaskLogVo equipTaskLogVo = new EnWzEquipTaskLogVo();
            BeanUtil.copyProperties(equipTaskVo, equipTaskLogVo);
            equipTaskLogVo.setTaskLogType("task");
            equipTaskLogVo.setStockNum("0");
            equipTaskLogVo.setPd("1");
            resultList.add(equipTaskLogVo);
        });
        return resultList;
    }

}
